perm filename DISKLA[MLI,LSP] blob sn#010969 filedate 1975-06-03 generic text, type T, neo UTF8
(OPS HRR 540000 HRL 504000 HRLZ 514000 HRRM@ 542020 SETZM 402000 SETZM@ 402020 XCT 256000 EXCH 250000
	ADDI 271000 SUBI 275000 IMUL 220000 XOR 430000 ROT 241000 LDB 135000 DPB 137000
	SOJE 362000 SOJL 361000 CAMLE 313000 SKIPN 336000 X 0 INUM0 577777
	USETI 074000 USETO 075000 UGETF 073000)

(LAP UREAD SUBR)				~ (UREAD  RECORD#) - RECORD# MUST BE IN MACHINE REP.
	(SETZM@ 0 X)				~ [TYIA:OLDCH]			MAKE SURE READ DOES AN INPUT
	(SETZM@ 0 X)				~ [TYI2:CHARACTER COUNT]	TO FILL A NEW BUFFER.
	(LDB 2 PTR1:)				~ SET UP THE CHANNEL NUMBER FOR THE USETI CALL.
	(DPB 2 PTR2:)
USETI:	(USETI X 0 1)
	(JCALL 0 (E READ))
PTR1:	(270400 0 X)				~ (PTR ACFIELD 4 [TYI2X:CHANNEL NUMBER])
PTR2:	(270400 0 USETI:)			~ (PTR ACFIELD 4 USETI:)
	NIL

(LAP UPRINT SUBR)				~ (UPRINT  SEXP  RECORD#) - RECORD# MUST BE IN MACHINE REP.
	(XCT 0 X)				~ [TYO2X:[OUT X,]] - MAKE SURE THE PRINT BUFFER IS EMPTY.
	(LDB 3 PTR1:)				~ SET UP THE CHANNEL NUMBER FOR THE USETO CALL.
	(DPB 3 PTR2:)
USETO:	(USETO X 0 2)
	(JCALL 1 (E PRINT))
PTR1:	(270400 0 X)				~ (PTR ACFIELD 4 [TYO2X:CHANNEL NUMBER])
PTR2:	(270400 0 USETO:)			~ (PTR ACFIELD 4 USETI:)
	NIL

(LAP UGETF SUBR)				~ (UGETF) - RETURN MACHINE REP. FOR NEXT RECORD TO WRITE ON.
	(XCT 0 X)				~ [TYO2X:[OUT X,]] - MAKE SURE THE PRINT BUFFER IS EMPTY.
	(XCT 0 X)				~ [TYO2X:[OUT X,]] - MAKE DAMN SURE!
	(LDB 1 PTR1:)				~ SET UP THE CHANNEL NUMBER FOR THE UGETF CALL.
	(DPB 1 PTR2:)
	(MOVEI 1 0)
UGETF:	(UGETF X 1)
	(POPJ P)
PTR1:	(270400 0 X)				~ (PTR ACFIELD 4 [TYO2X:CHANNEL NUMBER])
PTR2:	(270400 0 UGETF:)			~ (PTR ACFIELD 4 UGETF:)
	NIL

(LAP HASH_GET SUBR)				~ (HASH_GET  ATOM)
	(CALL 1 (E HASH))
	(HLRZ 2 1)				~ 1ST HASH.
	(ADD 2 (SPECIAL !HASH_TABLE_BASE))	~ ADD IT TO THE BASE OF THE HASH TABLE.
	(HRRZ 1 1)				~ 2ND HASH.
	(MOVE 3 (SPECIAL !HASH_MAX))		~ MAX # OF SUCCESSIVE LOCATIONS TO LOOK IN.
LOOP:	(HLRZ 4 0 2)				~ GET THE HASH TABLE ENTRY.
	(CAMN 1 4)				~ SECOND HASHES MATCH?
	(JCALL 3 (E HASH_SAVE))			~ YES, WE'RE DONE.
	(SOJL 3 NOPE:)				~ NO, KEEP GOING?
	(ADDI 2 1)				~ YES.
	(CAMLE 2 (SPECIAL !HASH_TABLE_TOP))	~ WRAP AROUND?
	(MOVE 2 (SPECIAL !HASH_TABLE_BASE))	~ YES, GO BACK TO THE BEGINNING.
	(JRST 0 LOOP:)
NOPE:	(MOVEI 1 (QUOTE NIL))			~ RETURNS NIL IF ENTRY NOT FOUND.
	(POPJ P)
	NIL

(LAP HASH_PUT SUBR)				~ (HASH_PUT  ATOM  VALUE)
	(PUSH P 2)
	(CALL 1 (E HASH))
	(HLRZ 2 1)				~ 1ST HASH.
	(ADD 2 (SPECIAL !HASH_TABLE_BASE))	~ ADD IT TO THE BASE OF THE HASH TABLE.
	(HRLZ 1 1)				~ PUT THE 2ND HASH IN THE LEFT HALF.
	(HRR 1 0 P)				~ NOW 1 = [2ND HASH, VALUE]
	(SUB P (C 0 0 1 1))
	(MOVE 3 (SPECIAL !HASH_TABLE_MSIZE))	~ MAX # OF SUCCESSIVE LOCATIONS TO LOOK IN.
LOOP:	(SKIPN 0 0 2)				~ HASH TABLE LOCATION EMPTY (= 0) ?
	(JRST 0 FOUND:)				~ YES.
	(SOJE 3 NOPE:)				~ NO, KEEP GOING?
	(ADDI 2 1)				~ YES.
	(CAMLE 2 (SPECIAL !HASH_TABLE_TOP))	~ WRAP AROUND?
	(MOVE 2 (SPECIAL !HASH_TABLE_BASE))	~ YES, GO BACK TO THE BEGINNING.
	(JRST 0 LOOP:)
FOUND:	(MOVEM 1 0 2)				~ PUT THE VALUE IN THE HASH TABLE LOCATION.
	(HRRZ 1 1)				~ RETURNS THE VALUE PUT IN THE TABLE IF SUCCESSFUL.
	(MOVE 2 (SPECIAL !HASH_TABLE_MSIZE))	~ COMPUTE # OF SUCCESSIVE LOCATIONS WE HAD TO LOOK IN.
	(SUB 2 3)
	(CAMLE 2 (SPECIAL !HASH_MAX))		~ LARGEST NUMBER SO FAR?
	(MOVEM 2 (SPECIAL !HASH_MAX))		~ YES.
	(POPJ P)
NOPE:	(MOVEI 1 (QUOTE NIL))			~ RETURNS NIL IF VALUE COULD NOT BE PUT IN TABLE.
	(POPJ P)
	NIL

(LAP HASH SUBR)					~ (HASH  ATOM) - RETURNS [1ST HASH, 2ND HASH]
	(MOVEI 2 (QUOTE PNAME))
	(CALL 2 (E GET))			~ GET THE PRINTNAME OF THE ATOM.
	(MOVEI 2 0)				~ 2 WILL HOLD: P1⊗P2⊗...⊗Pn, Pi = iTH PRINTNAME WORD.
LOOP:	(HLRZ@ 3 1)				~ CAR PRINTNAME.
	(HRRZ@ 1 1)				~ CDR PRINTNAME.
	(ROT 2 1)				~ ROTATE THE TOTAL LEFT ONE BIT TO OFFSET IT.
	(XOR 2 0 3)				~ EXCLUSIVE-OR THE ASCII INTO THE TOTAL.
	(JUMPN 1 LOOP:)
	(MOVE 1 2)				~ NOW 1 CONTAINS P1⊗P2⊗...Pn
	(PUSH P 1)
	(CALL 1 (E HASH1))			~ 1ST HASH.
	(EXCH 1 0 P)
	(CALL 1 (E HASH2))			~ 2ND HASH.
	(HRL 1 0 P)				~ [1ST HASH, 2ND HASH]
	(SUB P (C 0 0 1 1))
	(POPJ P)
	NIL

(LAP HASH1 SUBR)				~ (HASH1  WORD) - RETURNS AN 11-BIT HASH.
	(IMUL 1 (C 352042 0 223027))		~ X*PIE
	(ADD 1 (C 312416 0 161755))		~ X*PIE + E
	(LDB 1 (C 311300 0 1))			~ (PTR 36-11 11 1) - CHANGE THIS IF HASH TABLE SIZE CHANGES.
	(POPJ P)
	NIL

(LAP HASH2 SUBR)				~ (HASH2  WORD) - RETURNS AN 18-BIT HASH.
	(IMUL 1 (C 312416 0 161755))		~ X*E
	(ADD 1 (C 352042 0 223027))		~ X*E + PIE
	(LDB 1 (C 222200 0 1))			~ (PTR 36-18 18 1)
	(POPJ P)
	NIL

(LAP HASH_CONTINUE SUBR)			~ CONTINUES WHERE THE LAST HASH_GET LEFT OFF.
	(MOVE 1 (SPECIAL !HASH_SAVE1))		~ RESTORE AC'S 1-3.
	(MOVE 2 (SPECIAL !HASH_SAVE2))
	(MOVE 3 (SPECIAL !HASH_SAVE3))
LOOP:	(SOJL 3 NOPE:)				~ KEEP GOING?
	(ADDI 2 1)				~ YES.
	(CAMLE 2 (SPECIAL !HASH_TABLE_TOP))	~ WRAP AROUND?
	(MOVE 2 (SPECIAL !HASH_TABLE_BASE))	~ YES, GO BACK TO THE BEGINNING.
	(HLRZ 4 0 2)				~ GET THE HASH TABLE ENTRY.
	(CAME 1 4)				~ 2ND HASHES MATCH?
	(JRST 0 LOOP:)				~ NO.
	(JCALL 3 (E HASH_SAVE))
NOPE:	(MOVEI 1 (QUOTE NIL))			~ RETURNS NIL IF ENTRY NOT FOUND.
	(POPJ P)
	NIL

(LAP HASH_SAVE SUBR)				~ SAVES THE AC'S AND RETURNS THE HASH TABLE VALUE.
	(MOVEM 1 (SPECIAL !HASH_SAVE1))
	(MOVEM 2 (SPECIAL !HASH_SAVE2))
	(MOVEM 3 (SPECIAL !HASH_SAVE3))
	(HRRZ 1 0 2)				~ GET THE HASH TABLE VALUE.
	(POPJ P)
	NIL

(LAP DEPOSIT_RH SUBR)				~ (DEPOSIT_RH  LOCATION  VALUE)
	(PUSH P 2)
	(CALL 1 (E NUMVAL))
	(EXCH 1 0 P)
	(CALL 1 (E NUMVAL))
	(POP P 2)
	(HRRM@ 1 2)
	(POPJ P)
	NIL